/**
*@note Copyright 2012-2022 CETHIK All Rights Reserved.
*@brief 基础层文件 
*@author tuyinan
*@data 2022-04-xx
*/
#ifndef COSTMAP_2D_LAYER_H_
#define COSTMAP_2D_LAYER_H_

#include <config_file.h>
#include <costmap_2d/costmap_2d.h>
#include <costmap_2d/data_collector.h>
#include <costmap_2d/layered_costmap.h>

#include <string>

namespace costmap_2d {
class LayeredCostmap;
/**
*@brief 基础层
*@author tuyinan
*@version 2022-04-xx
*/
class Layer {
 public:
 /**
 *@brief 构造函数
 *@param 无
 *@return void
 *@author: tuyinan
 *@version: 2022-04-xx
 */
  Layer();
/**
*@brief 初始化
*@param LayeredCostmap* parent 所属的地图层
*@param std::string name 名字
*@param ConfigFile* node 配置节点
*@param costmap_2d::DataCollector* collector 数据获取类
*@return void
*@author: tuyinan
*@version: 2022-04-xx
*/
  void initialize(LayeredCostmap* parent, std::string name, ConfigFile* node,
                  costmap_2d::DataCollector* collector);

  /**
   *@brief 更新地图边际
   *@param double robot_x 机器人位姿x
   *@param double robot_y 机器人位姿y
   *@param double robot_yaw 机器人角度
   *@param double* min_x 最小x
   *@param double* min_y 最小y
   *@param double* max_x 最大x
   *@param double* max_y 最大y
   *@return void
   *@author: tuyinan
   *@version: 2022-04-xx
   */
  virtual void updateBounds(double robot_x, double robot_y, double robot_yaw,
                            double* min_x, double* min_y, double* max_x,
                            double* max_y) {}
  /**
   *@brief 更新代价
   *@param costmap_2d::Costmap2D& 代价地图类
   *@param int min_i 最小的x
   *@param int min_j 最小的y
   *@param int max_i 最大的x
   *@param int max_j 最大的y
   *@return void
   *@author: tuyinan
   *@version: 2022-04-xx
   */
  virtual void updateCosts(Costmap2D& master_grid, int min_i, int min_j,
                           int max_i, int max_j) {}
/**
*@brief 不激活
*@param 无
*@return void
*@author: tuyinan
*@version: 2022-04-xx
*/
  virtual void deactivate() {}

/**
*@brief 激活
*@param 无
*@return void
*@author: tuyinan
*@version: 2022-04-xx
*/
  virtual void activate() {}
/**
*@brief 重置
*@param 无
*@return void
*@author: tuyinan
*@version: 2022-04-xx
*/
  virtual void reset() {}
/**
*@brief 析构函数
*@param 无
*@return void
*@author: tuyinan
*@version: 2022-04-xx
*/
  virtual ~Layer() {}

/**
*@brief 判断层内的数据是最新的
*@param 无
*@return bool 是或否
*@author: tuyinan
*@version: 2022--xx
*/
  bool isCurrent() const { return current_; }

  /**
   *@brief 地图大小适配主代价地图
   *@param 无
   *@return void
   *@author: tuyinan
   *@version: 2022-04-xx
   */
  virtual void matchSize() {}

/**
*@brief 获取名字
*@param 无
*@return std::string 名
*@author: tuyinan
*@version: 2022-04-xx
*/
  std::string getName() const { return name_; }

/**
*@brief 获取占位
*@param 无
*@return const std::vector<costmap_2d::Point>& 占位
*@author: tuyinan
*@version: 2022-04-xx
*/
  const std::vector<costmap_2d::Point>& getFootprint() const;

  /**
   *@brief 修改占位来适配主程序的占位
   *@param 无
   *@return void
   *@author: tuyinan
   *@version: 2022-04-xx
   */
  virtual void onFootprintChanged() {}

/// 配置节点
  ConfigFile* configNode_;
/// 数据获取类
  costmap_2d::DataCollector* data_collector_;

 protected:
  /**
   *@brief 初始化函数
   *@param 无
   *@return void
   *@author: tuyinan
   *@version: 2022-04-xx
   */
  virtual void onInitialize() {}

/// 代价地图
  LayeredCostmap* layered_costmap_;
/// 是否数据是最新的
  bool current_;
/// 是否开启
  bool enabled_; 
  /// 名字
  std::string name_;

 private:
 /// 占位
  std::vector<costmap_2d::Point> footprint_spec_;
};

}  // namespace costmap_2d

#endif  // COSTMAP_2D_LAYER_H_
